
package game;
import boundaryToMatador.GUI;

public class Board {

	public final static Field[] fields = {

		//For street er de givne givet i rækkefølgen:
		new Refuge("Start"), //0
		new Street("Rødovrevej", 1, 1200, new int[] {50, 250, 750, 2200, 4000, 6000}, 1000),
		new Chance("Prøv Lykken"),
		new Street("Hvidovrevej", 1, 1200, new int[] {50, 250, 750, 2200, 4000, 6000}, 1000),
		new Tax("Indkomstskat", 4000),
		new Ship("SFL"),  //5
		new Street("Roskildevej", 2, 2000, new int[] {100, 600, 1800, 5400, 8000, 11000}, 1000),
		new Chance("Prøv Lykken"),
		new Street("Valby Langgade", 2, 2000, new int[] {100, 600, 1800, 5400, 8000, 11000}, 1000),
		new Street("Allégade", 2, 2400, new int[] {150, 800, 2000, 6000, 9000, 12000}, 1000),
		new Refuge("På Besøg i Fængsel"), //10
		new Street("Frederiksberg Allé", 3, 2800, new int[] {200, 1000, 3000, 9000, 12500, 15000}, 2000),
		new Brewery("Tuborg"), //12
		new Street("Bülowvej", 3, 2800, new int[] {200, 1000, 3000, 9000, 12500, 15000}, 2000),
		new Street("Gl. Kongevej", 3, 3200, new int[] {250, 1250, 3750, 10000, 14000, 18000}, 2000),
		new Ship("DSB Rederierne Kalundborg/Århus"), //15
		new Street("Bernstofvej", 4, 3600, new int[] {300, 1400, 4000, 11000, 15000, 19000}, 2000),
		new Chance("Prøv Lykken"), 
		new Street("Hellerupvej", 4, 3600, new int[] {300, 1400, 4000, 11000, 15000, 19000}, 2000),
		new Street("Strandvej", 4, 4000, new int[] {350, 1600, 4400, 12000, 16000, 20000}, 2000), 
		new Refuge("Parkering"), //20
		new Street("Trianglen", 5, 4400, new int [] {350, 1800, 5000, 14000, 17500, 21000}, 3000),
		new Chance("Prøv Lykken"),
		new Street("Østerbrogade", 5, 4400, new int [] {350,1800, 5000, 14000, 17500, 21000}, 3000),
		new Street("Grønningen", 5, 4800, new int [] {400, 2000, 600, 15000, 18500, 20000}, 3000),
		new Ship("DFDS Seaways"), //25
		new Street("Bredgade", 6, 5200, new int [] {450, 2200, 6600, 16000, 19500, 23000}, 3000),
		new Street("Kgs. Nytorv", 6, 5200, new int [] {450, 2200, 6600, 16000, 19500, 23000}, 3000),
		new Brewery("Coca-Cola"), //28
		new Street("Østergade", 6, 5600, new int [] {500, 2400, 7200, 17000, 20500, 24000}, 3000),
		new GoToJail("De Fængsles"),
		new Street("Amagertorv", 7, 6000, new int[] {550, 2600, 7800, 18000, 20000, 25000}, 4000),
		new Street("Vimmelskaftet", 7, 6000, new int [] {550, 2600, 7800, 18000, 20000, 25000}, 4000),
		new Chance("Prøv Lykken"),
		new Street("Nygade", 7, 6400, new int [] {600, 3000, 9000, 20000, 24000, 28000}, 4000),
		new Ship("DSB Rederierne Halskov/Knudshoved"), //35
		new Chance("Prøv Lykken"),
		new Street("Frederiksberggade", 8, 7000, new int [] {700, 3500, 10000, 22000, 26000, 30000}, 4000),
		new Tax("Extraordinær Statsskat", 2000),
		new Street("Rådhuspladsen", 8, 8000, new int[] {1000, 4000, 12000, 28000, 34000, 40000}, 4000), //39
	};

	public int[] fieldsOwned(Player player){

		int count=0;

		for(int i=0 ; i<fields.length ; i++){

			if(fields[i] instanceof Ownable ){
				Ownable field = (Ownable) fields[i];
				if(field.getOwner() == player){
					count++;
				}
			}
		}

		int[] fieldsOwned = new int[count];
		count = 0;
		for(int i=0 ; i<fields.length ; i++){
			if (fields[i] instanceof Ownable){
				fieldsOwned[count] = i; 
				count++;
			}
		}

		return fieldsOwned;

	}
	// En metode der finder, og sætter grupper ejet af en spiller inde i et array.
	// længden af arrayet er antallet af grupper der er ejet, og indholdet er nummeret på gruppen ejet minus 1.
	public static int[] availableGroups(Player player){
		boolean[] noOfGroupsOwned= {false,false,false,false,false,false,false,false};
		int[] fieldsOwned = {0,0,0,0,0,0,0,0};
		int arraySize =0;

		for(int i =0; i<fields.length; i++){
			if ((fields[i] instanceof Street)&&(((Street)Board.fields[i]).getMortgage()==false)) {
				if(((Street)fields[i]).getOwner()==player){
					fieldsOwned[((Street)fields[i]).getGroup()-1]=fieldsOwned[((Street)fields[i]).getGroup()-1]+1;
				}
			}
		}
		// Kontrollere om felterne er ejet, ved at se om fieldsOwned er lig antallet af 
		if(fieldsOwned[0]==2){
			noOfGroupsOwned[0]=true;
			arraySize++;	
		}
		if(fieldsOwned[7]==2){
			noOfGroupsOwned[7]=true;
			arraySize++;
		}
		for (int i = 0; i < fieldsOwned.length; i++) {
			if(fieldsOwned[i]==3){
				noOfGroupsOwned[i]=true;
				arraySize++;
			}
		}
		int count =0;
		int[] groupsOwned = new int[arraySize];
		for (int i = 0; i < noOfGroupsOwned.length; i++) {
			if(noOfGroupsOwned[i]==true){
				groupsOwned[count]=i;
				count++;
			}
		}
		return groupsOwned;
	}

	//En metode der gør at man kan købe huse og hoteller på sine grunde, checker om en hel gruppe er ejet
	//og automatisk sætter de ønskede antal huse på feltet, med 1 hus på den dyreste grund først og derefter fordeler ligeligt.
	public static void buyPropertyGroup(Player player, int groupNumber, int amount){
		Field[] purchase = new Field[3];

		// checker om et felt tilhører gruppenummeret, og smider dette ind i et array.
		int count = 0;
		for(int i = 0; i < fields.length; i++){
			if((fields[i]instanceof Street)&&(((Street) fields[i]).getGroup()==groupNumber)){

				purchase[count]=fields[i];
				count++;



			}
		}
		// if else sætning med formål at sætte bygninger rigtigt, da der er forskellige antal felter i grupperne
		int arrayLength;
		if(purchase[2]==null){

			arrayLength = 2;
		}
		else{
			arrayLength = 3;
		}

		int checkProperty =1;
		int housesPlaced =0;
		int iNeedaHouse = 0;
		int mostHouses =1000;
		
if(amount<=0){
	amount=0;
}
		while(housesPlaced!=amount){
			for (int i = 0; i < arrayLength; i++) {
				if	(((Street)purchase[i]).getProperty()< mostHouses){
					mostHouses = ((Street)purchase[i]).getProperty();
					iNeedaHouse=i;
				}
			}
			for (int j = iNeedaHouse; j < arrayLength; j++) {
				if((purchase[j]instanceof Street)&&(housesPlaced!=amount)){
					((Street)purchase[j]).buyProperty(1);
					housesPlaced++;
					
					for (int i = 0; i < fields.length; i++) {
										
						if((fields[i]==purchase[j])&&(((Street)fields[i]).getProperty()!=5)){
							GUI.setHouses(i+1, ((Street)fields[i]).getProperty());
						}
							else if((fields[i]==purchase[j])&&(((Street)fields[i]).getProperty()==5)){
								GUI.setHotel(i+1, true);
							}
						}
						
					}
			
				}
			}
	
	}

	//placerer et hus på hvert felt indtil antal af satte bygninger er lig antal købte bygninger

	//salg af ejendom
	public static void sellPropertyGroup(Player player, int groupNumber, int amount){

		int removedProperty = 0;
		int count = 0;

		Street[] streetsInGroup = new Street[3];
		for(int i=0 ;i < Board.fields.length ; i++){
			if((Board.fields[i] instanceof Street) && (((Street) Board.fields[i]).getGroup()==groupNumber)){
				streetsInGroup[count] = ((Street)Board.fields[i]);
				count++;
			}
		}

		while(removedProperty<amount){
			for (int i=count-1 ; i>=0 ; i--) {
				if(removedProperty<amount){	
					streetsInGroup[i].sellProperty(1);
					removedProperty++;
					for (int j = 0; j <fields.length; j++) {
						
						if (streetsInGroup[i] == fields[j]) {
							GUI.setHouses(j+1, (streetsInGroup[i].getProperty()));
						}
						
					}
				}
				
			}
			
		}
	}
}